gdk: Allow display subclasses to override the type used for windows
authorBenjamin Otte <otte@redhat.com>
Tue, 21 Dec 2010 02:13:55 +0000 (03:13 +0100)
committerMatthias Clasen <mclasen@redhat.com>
Tue, 21 Dec 2010 17:07:08 +0000 (12:07 -0500)
We want to have different window types for different displays, so we can
write code like this:

  #if GDK_WINDOWING_X11
    if (GDK_IS_X11_WINDOW (window))
      {
        /* do x11 stuff */
      }
    else
  #endif
  #if GDK_WINDOWING_WAYLAND
    if (GDK_IS_WAYLAND_WINDOW (window))
      {
        /* do wayland stuff */
      }
    else
  #endif
      {
        /* do stuff for unsupported system */
    }

This requires different GdkWindow types and we currently don't have
that, as only the GdkWindowImpl differs. With this method, every backend
defines a custom type that's just a simple subclass of GdkWindow. This
way GdkWindow behaves like all the other types (visuals, screens,
displays) and we can write code like the above.

gdk/gdkdisplay.c
gdk/gdkdisplayprivate.h

index ba912f25a3a7affc34351be28cebc96aa9116759..117f906c1ea89ef6790c2371f9ae0fb01af43e03 100644 (file)
@@ -186,6 +186,7 @@ gdk_display_class_init (GdkDisplayClass *class)
   object_class->dispose = gdk_display_dispose;
 
   class->get_app_launch_context = gdk_display_real_get_app_launch_context;
+  class->window_type = GDK_TYPE_WINDOW;
 
   /**
    * GdkDisplay::opened:
@@ -2501,7 +2502,7 @@ _gdk_display_create_window_impl (GdkDisplay       *display,
 GdkWindow *
 _gdk_display_create_window (GdkDisplay *display)
 {
-  return g_object_new (GDK_TYPE_WINDOW, NULL);
+  return g_object_new (GDK_DISPLAY_GET_CLASS (display)->window_type, NULL);
 }
 
 /**
index 608e7b1500dfb17fa53303e659debfe140acaee7..29ab8460dabe145ce3b6adaf6ba893c2022bf4c5 100644 (file)
@@ -115,6 +115,8 @@ struct _GdkDisplayClass
 {
   GObjectClass parent_class;
 
+  GType window_type;          /* type for native windows for this display, set in class_init */
+
   G_CONST_RETURN gchar *     (*get_name)           (GdkDisplay *display);
   gint                       (*get_n_screens)      (GdkDisplay *display);
   GdkScreen *                (*get_screen)         (GdkDisplay *display,